package main

import (
	"fmt"

	"gorm.io/driver/mysql"
	"gorm.io/gorm"
)

// 定义结构体（模型类）
// 图书
type Book struct {
	gorm.Model           // 自动给表添加Id、CreatedAt、UpdatedAt、DeletedAt
	Title        string  `gorm:"size:50;unique;not null"`
	Price        float64 `gorm:"type:decimal(7, 2);default 0"`
	Pub          string  `gorm:"size:50"`
	Market_price float64 `gorm:"type:decimal(7, 2);default 0"`
}

// 设置迁移到数据库中的表名称
func (b Book) TableName() string {
	return "book"
}

func main() {
	dsn := "root:123456@tcp(192.168.88.11:3306)/gorm_test?charset=utf8mb4&parseTime=True&loc=Local"
	// 连接数据库
	// gorm.Open(mysql.New(mysql.Config{DSN: "xxx"}), &gorm.Config{})
	db, err := gorm.Open(mysql.Open(dsn), &gorm.Config{})
	if err != nil {
		panic(err)
	}
	// fmt.Println("连接成功：", db)
	// 迁移
	db.AutoMigrate(&Book{})
	// 1.插入数据
	/*
		students := []Book{
			{Title: "Golang", Price: 92.8, Pub: "清华大学出版社", Market_price: 85.9},
			{Title: "Python", Price: 42.5, Pub: "机械工业出版社", Market_price: 40},
			{Title: "Java", Price: 55.2, Pub: "清华大学出版社", Market_price: 49.9},
			{Title: "Node.js", Price: 45.8, Pub: "清华大学出版社", Market_price: 42},
			{Title: "HTML", Price: 35, Pub: "机械工业出版社", Market_price: 33.9},
			{Title: "Gin", Price: 46.8, Pub: "中信出版社", Market_price: 42.9},
		}
		err = db.Create(&students).Error
		if err != nil {
			panic(err)
		}

		// 2.查询数据
		// 定义结构体变量，用于保存查询到的结果
		var b1 Book
		// err = db.First(&b1).Error
		// err = db.Last(&b1).Error
		err = db.Where("id = ?", 3).First(&b1).Error
		if err != nil {
			panic(err)
		}
		fmt.Println(b1)

		// 查询多条数据
		var b2 []Book
		err = db.Find(&b2).Error
		if err != nil {
			panic(err)
		}
		// fmt.Println(b2)
		for _, value := range b2 {
			fmt.Println(value.Title, value.Price, value.Pub)
		}

		// 条件查询
		var books []Book
		// err = db.Where("pub = ?", "清华大学出版社").Find(&books).Error
		// 添加指定的字段
		err = db.Select("title, pub").Where("pub = ?", "清华大学出版社").Find(&books).Error
		if err != nil {
			panic(err)
		}
		fmt.Println(books)

		// 排序
		var books []Book
		err = db.Order("price desc").Find(&books).Error
		if err != nil {
			panic(err)
		}
		// fmt.Println(books)
		for _, value := range books {
			fmt.Println(value.Title, value.Price)
		}

		// 分页查询
		var books []Book
		// Offset 偏移量   Limit 每页大小
		err = db.Limit(5).Offset(5).Find(&books).Error
		if err != nil {
			panic(err)
		}
		for _, value := range books {
			fmt.Println(value.Title, value.Price)
		}

		// 条件使用结构体
		var books []Book
		// err = db.Where(Book{Pub: "清华大学出版社"}).Find(&books).Error
		err = db.Where("price > ?", 50).Find(&books).Error
		if err != nil {
			panic(err)
		}
		for _, value := range books {
			fmt.Println(value.Title, value.Price)
		}

		// 聚合查询
		var counter int64 // 必须是int64
		db.Model(&Book{}).Count(&counter)
		fmt.Println(counter)

		var books Book
		db.Raw("select title,pub from book where id = ?", 1).Scan(&books)
		fmt.Println(books)

		// 3.修改数据
		// 修改1条: 先查询，再修改，最后保存
		var book Book
		err = db.Where("id = ?", 2).First(&book).Error
		if err != nil {
			panic(err)
		}
		// fmt.Println(book)
		book.Price = 55.5
		book.Market_price = 50
		db.Save(&book)

		// 修改多条
		// var book Book
		// db.Model(&Book{}).Where("pub = ?", "清华大学出版社").Update("price", 100).Update("market_price", 100)
		db.Model(&Book{}).Where("pub = ?", "清华大学出版社").Updates(
			Book{Price: 200, Market_price: 200},
		)

		// 4.删除数据
		// 查询数据，不会查询伪删除的数据
		var book Book
		err = db.Where("id = ?", 4).First(&book).Error
		if err != nil {
			panic(err)
		}
		// 删除，软删除
		count := db.Delete(&book).RowsAffected
		fmt.Println("删除的行数：", count)
	*/
	// 硬删除
	err = db.Unscoped().Delete(&Book{}, 4).Error
	if err != nil {
		panic(err)
	}
	fmt.Println("删除成功")
}
